package digitrencer;

/**
 * A bemeneti elemek gyűjtőosztálya. Minden bemeneti alkatrészt megvalósító
 * osztályt ebből az osztályból származtatunk, valamint itt valósítjuk meg
 * ezeknek a közös fukcióit.
 * @author taplonaplo
 */
public abstract class Input extends Element {
        /**
         * Ez az érték reprezentálja a kimenet(ek) éppen aktuális értékét.
         */
	protected boolean[] value;


        /**
         * Input osztály konstruktora. Meghívja az Element konstruktorát, majd
         * ellenőrzi, hogy kapott-e bemeneti vezetékeket. Amennyiben igen, hibát
         * dob, mivel az Input osztály tagjainak nem lehetnek ilyen vezetékei,
         * mert bemeneti alkatrészek.
         * @param inputs    Bemeneti vezetékek
         * @param outputs   Kimeneti vezetékek
         * @throws IllegalArgumentException Amennyiben megadtunk bemeneti vezetéket.
         */
        Input(Wire[] inputs, Wire[] outputs) throws IllegalArgumentException{ //by Gergő
            super(inputs,outputs);
            if (inputs.length > 0)
                throw new IllegalArgumentException("An input object may not have input wires.");
            value = new boolean[outputs.length];
        }

        /**
         * Input osztály futási metódusa. A bemenet értékeit rárakja a belőle
         * kifutó vezetékek elejére.
         */
    @Override
	public void run() {
            for (int i = 0; i < value.length; i++)
                out[i].setStart(value[i]);
	}

        /**
         * Metódus az Input value attribútumának lekérdezésére. Létrehoz egy
         * másolatot a bemenet jelenlegi értékeiről és ezt visszaadja.
         * @return A bemenet jelenlegi értékei.
         */
	public boolean[] getValue() {
            boolean[] val = new boolean[value.length];
            System.arraycopy(value, 0, val, 0, value.length);
            return val;
	}
}